using System;
using System.Linq.Expressions;
using System.Reflection;
using Magiq.Support;

namespace Magiq.Update {
    public class PropertySet : IPropertySet {
        private readonly PropertyInfo propertyInfo;
        private Type declaringType;

        public PropertySet(LambdaExpression property, LambdaExpression value) {
            ValueExpression = value;
            propertyInfo = property.ToPropertyInfo();
            PropertyExpression = property;
        }

        #region IPropertySet Members

        public string PropertyName {
            get { return propertyInfo.Name; }
        }

        public LambdaExpression ValueExpression { get; private set; }

        public Type PropertyType {
            get { return propertyInfo.PropertyType; }
        }

        public LambdaExpression PropertyExpression { get; private set; }

        public Type DeclaringType {
            get {
                if (declaringType == null)
                    declaringType = PropertyExpression.LastExpressionChain().Body.Type;
                return declaringType;
            }
        }

        public Type ValueType {
            get { return ValueExpression.Body.Type; }
        }

        public string ParentKey {
            get { return PropertyExpression.PreviousExpressionChain(true).ToString().From("."); }
        }

        #endregion
    }
}